<?php

/**
 * Description of VtaDefinitivaStrategy
 *
 * @author maxi
 */
class VtaDefinitivaStrategy implements VentasStrategy {

    /**
     * Realiza el proceso de guardado de una venta definitiva y la actualizacion de las otras entidades
     * @param Clientes $cliente
     * @param tipo de Venta $tipoVta
     * @param int $idVenta
     * @param array $tiposPago
     * @return bool; true si todo fue correcto, false en caso contrario
     */
    public function checkOut($cliente, $tipoVta, $idVenta=null, $tiposPago=null) {
        $con = Propel::getConnection();

        try {
            //abrimos la transacción
            $con->beginTransaction();

            //operaciones pertinentes contra la base de datos
            $vm = VentasManager::getInstance();
            $iva = $vm->getIva() / 100;
            $carro = sfContext::getInstance()->getUser()->getAttribute('venta');

            if (!empty($carro)) {

                //Obtener Total
                $total = $vm->getPrecioFinal();

                //Se trata de una edicion actualiza la venta y los valores
                if (!empty($idVenta)) {
                    $venta = VentasPeer::existe($idVenta);
                    //existe en BD?
                    if ($venta) {
                        $venta = VentasPeer::retrieveByPK($idVenta);

                        if (!empty($venta)) {
                            //Borrar detalle venta
                            $detalle = DetalleVentasPeer::BorrarDetalleDeVenta($idVenta);

                            if ($detalle) {
                                //actualizar valores
                                $tipVta = $venta->getVtaTipo();
                                if ($tipoVta != $tipVta) {
                                    $nroFactura = $vm->autogenerarNroFactura($tipoVta);
                                    $venta->setVtaNroFactura($nroFactura);
                                    $venta->setVtaTipo($tipoVta);
                                }

                                $venta->setVtaCliente($cliente);
                                $venta->setVtaTotal($total);
                                //$venta->setVtaFecha($fecha);
                                $venta->setVtaUsuario(sfContext::getInstance()->getUser()->getGuardUser()->getId());
                                $venta->save();
                            }
                        }
                    }


                } else {
                    $iva = $vm->getIva();
                    $userId = sfContext::getInstance()->getUser()->getGuardUser()->getId();
                    $nroFactura = $vm->autogenerarNroFactura($tipoVta);
                    $descuento = $vm->getDescuento();
                    $tiposPago = $vm->getFormasDePago();

                    //Guardar Compra
                    $venta = new Ventas();
                    $ventaGuardada = $venta->almacenarVenta($nroFactura, $cliente, $total, $tipoVta, $userId, $iva, $descuento, $tiposPago);
                }

                    if ($ventaGuardada) {

                        //Por cada detalle de la venta lo guarda y actualiza el stock de la venta
                        foreach ($carro["productos"] as $producto) {

                            $prod = $producto["producto"];
                            $cant = $producto["cantidad"];

                            $articulo = $prod->getProArticulo();
                            $precio = $prod->getProPrecio();
                            $talle = $prod->getProTalle();
                            $ganancia = $prod->getProGanancia();
                            $idVenta = $venta->getVtaId();
                            //Guardar Detalle
                            $detalle = new DetalleVentas();
                            $detalle->almacenarDetalleVenta($articulo, $cant, $precio, $talle, $ganancia, $idVenta);

                            $tipoIng = sfConfig::get('app_caja_operacion_ingreso');
                            $producto = ProductosPeer::retrieveByPK($prod->getProArticulo(), $prod->getProTalle());
                            if (!empty($producto)) {
                                $producto->actualizarStock($cant, $tipoIng);
                            }
                        }
                    }

                    //Si paga en efectivo actualiza caja
                    if (array_key_exists("efectivo", $carro["pagos"])) {

                        $dineroEfectivo = $carro["pagos"]["efectivo"];
                        //Aumentar Precio en caja
                        $caja = new Caja();
                        $caja->almacenarCaja($dineroEfectivo, sfConfig::get('app_caja_operacion_ingreso'));
                    }

                    //Si paga en cuenta corriente actualizaa la cuenta corriente del cliente asociado a la venta
                    if (array_key_exists("cta_cte", $carro["pagos"])) {

                        $dineroCtaCte = $carro["pagos"]["cta_cte"];
                        //Chequear si cliente tiene cta cte
                        $ctaCte = CuentasCorrientesPeer::retrieveByPK($cliente);
                        if (!empty($ctaCte)) {
                            //De tener se suma el monto a la deuda existentes
                            $deuda = $ctaCte->getCtaCteDeuda();
                            $nuevoMonto = $dineroCtaCte + $deuda;
                            $ctaCte->setCtaCteDeuda($nuevoMonto);
                            $ctaCte->save();
                        } else {
                            //De no tener crea una con el monto correspondiente
                            $ctaCte = new CuentasCorrientes();
                            $ctaCte->setCtaCteCliente($cliente);
                            $ctaCte->setCtaCteDeuda($dineroCtaCte);
                            $ctaCte->setCtaCteFechaLimite(date('Y-m-d') + sfConfig::get('app_plazo_cta_cta'));
                            $ctaCte->save();
                        }
                    }
                    //$caja = new Caja();
                    //$caja->almacenarCaja($dineroEfectivo, sfConfig::get('app_caja_operacion_ingreso'));

                    $userId = sfContext::getInstance()->getUser()->getGuardUser()->getId();
                    $motivo = "Venta - ID " . $venta->getVtaId();
                    $operacion = sfConfig::get('app_caja_operacion_ingreso');

                    //Agregar operacion
                    $operacion = new Operaciones();
                    $operacion->agregarOperacion($total, $motivo, $operacion, $userId);
                
            }     //si todo va bien guardamos los cambios
            $con->commit();
            return true;
        } catch (Exception $e) {

            // Hacemos rollback de los cambios en caso de fallo
            $con->rollBack();
            return false;
            //devolvemos el error al depurador

        }
    }

}

?>
